package ir.xweb.data; import ir.xweb.util.MimeType; import org.jdom.Content; import org.jdom.Document; import org.jdom.Element; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; import java.io.IOException; import java.io.Writer; import java.util.Arrays; import java.util.Collection; import java.util.Map; public class XmlFormatter2 implements Formatter { @Override public void write(final Writer writer, final Object object) throws IOException { if(writer == null) { throw new IllegalArgumentException("null writer"); } if(object == null) { throw new IllegalArgumentException("null object"); } final Document document = new Document(Arrays.asList(toElement(object))); final XMLOutputter xmlOutput = new XMLOutputter(); xmlOutput.setFormat(Format.getPrettyFormat()); xmlOutput.output(document, writer); } private Element toElement(final Object object) { if(object instanceof Map) { final Map<?, ?> map = (Map) object; final String name = (object instanceof AnnotedMap) ? ((AnnotedMap) object).name : "Map"; final Element element = new Element(name); for(Map.Entry e:map.entrySet()) { if(e.getValue() != null) { final Element sub = toElement(e.getValue()); sub.setAttribute("key", e.getKey().toString()); element.addContent(sub); } } return element; } else if(object instanceof Collection) { final Collection<?> collection = (Collection) object; final Element element = new Element("Collection"); for(Object o:collection) { if(o != null) { final Content c = toElement(o); element.addContent(c); } /*if(c instanceof Text) { final Element sub = new Element(o.getClass().getSimpleName()); sub.addContent(c); element.addContent(sub); } else { final List<?> childs = ((Element)c).getChildren(); for(int i=childs.size()-1; i>=0; i--) { final Content child = (Content) childs.get(i); child.detach(); element.addContent(child); } }*/ } return element; } else { final Element element = new Element(getType(object)); element.addContent(object.toString()); return element; } } private String getType(final Object o) { if(o instanceof Map) { return "Map"; } else if(o instanceof Collection) { return "Collection"; } return o.getClass().getSimpleName(); } @Override public String getContentType() { return MimeType.get("xml"); } }